Conversation
|
Review requested:
|
5aaa29d to
3e9232b
Compare
3e9232b to
28d1af6
Compare
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #62501 +/- ##
==========================================
+ Coverage 89.69% 89.71% +0.01%
==========================================
Files 692 692
Lines 214039 214061 +22
Branches 41064 41066 +2
==========================================
+ Hits 191985 192037 +52
+ Misses 14134 14098 -36
- Partials 7920 7926 +6
🚀 New features to boost your workflow:
|
ljharb
left a comment
There was a problem hiding this comment.
I think this could be used by malicious code to behave well in tests, and then behave badly in prod. it'd be different if it was like t.getContext(), though, because malicious code wouldn't have access to t. As it is, it feels like an implicit global communications channel, and those are not advisable.
Only requesting changes to ensure that with multiple stamps, it doesn't land until this item is discussed.
|
@ljharb wdym? It's for tracing so you can get a consistent trace how is that related to behavior change compared to prod? It's just the "frameworkness" of a test-runner |
|
@ljharb not sure who uses
|
|
I'm not saying they'd use node:test in prod. I'm saying that this allows code to behave differently in tests versus not in tests because it creates the capability to determine if you're in tests or not.
right - that's internal state of the test runner that I don't think is safe to expose implicitly. I'm perfectly happy with the motivating use case - just not granting all code in the node process the ability to intercept it. Could this information be exposed in a more limited fashion, like in a loader or something? |
|
As I said this is already possible in user land tody, it just makes it less verbose. there is no new vector, just better DX. import { createHook, executionAsyncId } from 'node:async_hooks';
const testResources = new Map<number, any>();
function getTestContext() {
return testResources.get(executionAsyncId());
}
createHook({
init(asyncId, type, triggerAsyncId, resource: any) {
if (type === 'Test' && 'diagnostic' in resource && typeof resource.diagnostic === 'function') {
testResources.set(asyncId, resource);
return;
}
const parent = testResources.get(triggerAsyncId);
if (parent) {
testResources.set(asyncId, parent);
}
},
}).enable();this PR just simplifies this and makes it more accurate (uses instanceof instead of |
Exposes
getTestContext()function to access test context information from within tests and async operations.My use case was exposing a pino logger that writes to test diagnostics, but there can be many other usecases: